package com.celi.scs.common.utils;

import cn.hutool.core.date.DatePattern;
import com.celi.scs.common.constant.NumberConstant;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
/**
 * @project: bg-scs
 * @title: DateUtil
 * @author: lihq
 * @date: 2024/6/28 10:29
 * @version: v1.0
 * @description: 日期工具类
 */
public class DateUtil {

    public static void main(String[] args) {
        System.out.println(getDayOfMonth());
        System.out.println(getDayOfWeek());
        System.out.println(isYesterday(new Date()));
    }

    /**
     * 获取上周一日期
     * @return
     */
    public static Date getLastMonday() {
        SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, NumberConstant.Number_Minus_7); // 减去7天，即上周
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 设置为上周的周一
        return cn.hutool.core.date.DateUtil.parse(sdf.format(cal.getTime()));
    }

    /**
     * 获取上周五日期
     * @return
     */
    public static Date getLastFriday() {
        SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, NumberConstant.Number_Minus_7); // 减去7天，即上周
        cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // 设置为上周的周五
        return cn.hutool.core.date.DateUtil.parse(sdf.format(cal.getTime()));
    }

    /**
     * 获取本周日日期(周日开始)
     * @return
     */
    public static Date getLastSunday() {
        SimpleDateFormat sdf = new SimpleDateFormat(DatePattern.NORM_DATE_PATTERN);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        return cn.hutool.core.date.DateUtil.parse(sdf.format(calendar.getTime()));
    }

    /**
     * 获取上个月第一天(1号)
     * @return
     */
    public static Date getLastMonthFirstDay() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();

        // 获取当前月份的YearMonth对象
        YearMonth currentYearMonth = YearMonth.from(currentDate);

        // 获取上一个月份的YearMonth对象
        YearMonth lastMonth = currentYearMonth.minusMonths(NumberConstant.Number_1);

        // 获取上个月的1号
        LocalDate firstDayOfLastMonth = lastMonth.atDay(NumberConstant.Number_1);

        // 将LocalDate转换为java.util.Date
        return Date.from(firstDayOfLastMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取上个月最后一天
     * @return
     */
    public static Date getLastMonthLastDay() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();

        // 获取当前月份的YearMonth对象
        YearMonth currentYearMonth = YearMonth.from(currentDate);

        // 获取上一个月份的YearMonth对象
        YearMonth lastMonth = currentYearMonth.minusMonths(NumberConstant.Number_1);

        // 获取上个月的最后一天
        LocalDate lastDayOfLastMonth = lastMonth.atEndOfMonth();

        // 将LocalDate转换为java.util.Date
        return Date.from(lastDayOfLastMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 返回本周的最后一天(周日)
     * 比如今天周三 日期 2024-09-18 返回 2024-09-22 (周日)
     * @return
     */
    public static Date getCurrentSunday() {
        // 获取当前日期
        LocalDate today = LocalDate.now();

        // 使用 TemporalAdjusters 将日期调整到本周的最后一天（星期日）
        LocalDate lastDayOfWeek = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));

        // 将 LocalDate 转换为 java.util.Date
        return Date.from(lastDayOfWeek.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取本月的最后一天
     * 比如当前是9月 则返回2024年09月30日
     * @param date
     * @return
     */
    public static Date getLastDayOfMonth(Date date) {
        // 如果传入的日期为 null，使用当前日期
        LocalDate localDate = (date == null) ? LocalDate.now() : date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

        // 获取本月的最后一天
        LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());

        // 将 LocalDate 转换为 java.util.Date
        return Date.from(lastDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取本月年的最后一天
     * 比如当前是2024年 则返回2024年12月31日
     * @param date
     * @return
     */
    public static Date getLastDayOfYear(Date date) {
        // 如果传入的日期为 null，使用当前日期
        LocalDate localDate = (date == null) ? LocalDate.now() : date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

        // 获取该年的最后一天
        LocalDate lastDayOfYear = localDate.with(TemporalAdjusters.lastDayOfYear());

        // 将 LocalDate 转换为 java.util.Date
        return Date.from(lastDayOfYear.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取当前年
     * @param
     * @return
     */
    public static String getCurYear() {
        return String.valueOf(LocalDate.now().getYear());
    }

    /**
     * 返回今天是周几
     * @return
     */
    public static DayOfWeek getDayOfWeek() {
        return LocalDate.now().getDayOfWeek();
    }

    /**
     * 获取今天是几号
     * 比如 11月5号 返回5
     * @return
     */
    public static int getDayOfMonth() {
        return LocalDate.now().getDayOfMonth();
    }

    /**
     * 判断日期是否是昨天
     * @param date
     * @return
     */
    public static boolean isYesterday(Date date) {
        Calendar calendar = Calendar.getInstance();

        // 获取今天的日期
        calendar.setTime(new Date());
        // 设置时间为零时，确保比较的是日期
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        long todayStartTime = calendar.getTimeInMillis();

        // 获取昨天的日期
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        long yesterdayStartTime = calendar.getTimeInMillis();

        // 获取要检查的日期
        long dateStartTime = date.getTime();

        // 判断是否在昨天的日期范围内
        return dateStartTime >= yesterdayStartTime && dateStartTime < todayStartTime;
    }

    /**
     * 获取上一年的第一天 比如今年是2024年 则返回2023-01-01
     * @return
     */
    public static Date getLastYearFirstDay() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();

        // 获取上一年度的1月1号
        LocalDate previousYearStart = LocalDate.of(currentDate.getYear() - 1, 1, 1);

        // 将 LocalDate 转换为 Date
        return Date.from(previousYearStart.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

}
